package BF;

import java.util.*;

class BloomFilter {
    private static final int DEFAULT_SIZE = 2<<29; //开辟空间
    private static final int[] seeds = new int[] { 5, 7, 11, 13, 31, 37, 61,22,2,77,3 }; //计算出8个不同的Hash值
    private BitSet bits = new BitSet(DEFAULT_SIZE); //Bit 实现类
    private SimpleHash[] func = new SimpleHash[seeds.length];

    public BloomFilter() {  //构造函数事前模拟出8个人出来
        for (int i = 0; i < seeds.length; i++) {
            func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
        }
    }

    public void add(String value) { //添加一个字符串到布隆器中
        for (SimpleHash f : func) {  //循环每个人计算一下hash值
            bits.set(f.hash(value), true); //将对应的hash位设为1
        }
    }

    public boolean contains(String value) { //判断字符串是否添加过
        if (value == null) {
            return false;
        }
        boolean ret = true;
        for (SimpleHash f : func) { //8个人进行判断,有一个人没见过就不存在
            ret = ret && bits.get(f.hash(value));
        }
        return ret;
    }

    // 内部类，simpleHash
    public static class SimpleHash {
        private int cap; //位图长度
        private int seed; //hash 计算值

        public SimpleHash(int cap, int seed) { //构造函数赋值
            this.cap = cap;
            this.seed = seed;
        }

        public int hash(String value) { //计算Hash值
            int result = 0;
            int len = value.length(); //计算出字符串的长度
            for (int i = 0; i < len; i++) {
                result = seed * result + value.charAt(i); //转为ascii 码
            }
            return (cap - 1) & result; //进行二进制的与运算
        }
    }

    public static void main(String[] args) {

        BloomFilter bf = new BloomFilter();


//        System.out.println(155&6666633);


        bf.add("java");
        for (int i=0;i<100000000;i++){
            bf.add(i+"n");
        }
        int count=0;
        boolean isOk=false;
        for (int i=0;i<100000000;i++){
             isOk=bf.contains(UUID.randomUUID().toString()+"nphp");
            if (isOk){
                System.out.println("OK");
                count++;
            }
        }
        System.out.println(bf.contains("java"));
        System.out.println(count);
//        String  a="1";
//        System.out.println(a.getBytes().length);
//        Scanner sc = new Scanner(System.in);
//        //利用hasNextXXX()判断是否还有下一输入项
//        while (sc.hasNext()) {
//            //利用nextXXX()方法输出内容
//            String str = sc.next();
//            System.out.println(str);
//        }

//
//        System.out.println(two/1024/1024);

        //计算指定对象及其引用树上的所有对象的综合大小，单位字节


//        System.out.println(Runtime.getRuntime().freeMemory());

//        System.out.println(String.valueOf(count));
//        System.out.println(bf.contains("java1"));

//        strs.add("hello word");
//        strs.add("test");


//        for (int i=0;i<strs.size();i++) {
//            String s = strs.get(i);
//            boolean bl = bf.contains(s);
//            if(bl){
//                System.out.println(i+","+s);
//            }else{
//                bf.add(s);
//            }
//        }
    }

}